/**
  ******************************************************************************
  * @file    SPI2_Config.h
  * @brief   SPI2硬件抽象层配置头文件
  * @author  18408107475@163.com
  * @version V2.0.0
  * @date    2025-05-24
  ******************************************************************************
  */

#ifndef __SPI2_CONFIG_H
#define __SPI2_CONFIG_H

/*---------------------------- 头文件包含 ----------------------------*/
#include "stm32f10x.h"      // STM32标准外设库
#include "stdbool.h"        // 布尔类型支持
#include "USART1_Config.h"
#include "NM25Q128_Ins.h"   // NM25Q128指令集定义

/*---------------------------- 硬件引脚定义 ----------------------------*/
/**
  * @brief SPI2片选信号(CS/NSS)引脚配置
  * @note 使用PB12作为软件控制的片选信号
  */
#define SPI2_CS1_PORT       GPIOB           // 片选信号端口
#define SPI2_CS1_PIN        GPIO_Pin_12     // 片选信号引脚

/*---------------------------- SPI模式定义 ----------------------------*/
/**
  * @brief SPI工作模式配置宏
  * @note 常用模式定义：
  * - Mode0: CPOL=0, CPHA=0
  * - Mode3: CPOL=1, CPHA=1
  */
#define SPI_MODE0_CPHA      SPI_CPHA_1Edge  // Mode0时钟相位
#define SPI_MODE0_CPOL      SPI_CPOL_Low    // Mode0时钟极性
#define SPI_MODE3_CPHA      SPI_CPHA_2Edge  // Mode3时钟相位
#define SPI_MODE3_CPOL      SPI_CPOL_High   // Mode3时钟极性

/*---------------------------- 函数声明 ----------------------------*/
/**
  * @brief  控制SPI2片选信号电平
  * @param  BitValue: 电平状态
  *         @arg 0: 拉低(选中设备)
  *         @arg 1: 拉高(取消选中)
  */
void SPI2_NSS(u8 BitValue);

/**
  * @brief  反初始化SPI2外设
  * @note   复位SPI2相关硬件配置
  */
void SPI2_Deinit(void);

/**
  * @brief  初始化SPI2外设
  * @param  CPHA: 时钟相位(SPI_CPHA_1Edge/SPI_CPHA_2Edge)
  * @param  CPOL: 时钟极性(SPI_CPOL_Low/SPI_CPOL_High)
  */
void SPI2_Config(u16 CPHA, u16 CPOL);

/**
  * @brief  SPI2初始化
  */
void SPI2_Init(void);

/**
  * @brief  SPI2睡眠
  */
void SPI2_Sleep(void);

/**
  * @brief  启动SPI传输(拉低NSS)
  * @note   需与SPI2_Stop()配对使用
  */
void SPI2_Start(void);

/**
  * @brief  停止SPI传输(拉高NSS)
  * @note   需与SPI2_Start()配对使用
  */
void SPI2_Stop(void);

/**
  * @brief  SPI2单字节收发
  * @param  SendByte: 待发送字节
  * @retval 接收到的字节(超时返回0xFF)
  */
u8 SPI2_SwapByte(u8 SendByte);

/**
  * @brief  发送指令和24位地址
  * @param  Instruction: 1字节指令码
  * @param  Address: 24位地址(高8位被忽略)
  * @retval bool: 发送成功状态
  *         @arg true: 发送成功
  *         @arg false: 地址无效(高8位非0)
  */
bool SPI2_SendBuffer(u8 Instruction, u32 Address);

#endif /* __SPI2_CONFIG_H */
